package com.zzuli.yxy.controller;

import com.zzuli.yxy.entity.Singer;
import com.zzuli.yxy.enumeration.AppHttpCodeEnum;
import com.zzuli.yxy.result.R;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import com.zzuli.yxy.service.SingerService;

import java.util.List;

/**
 * @auther pony
 * @create 2023-04-17 21:09
 */
@RestController
@RequestMapping("singer")
@CrossOrigin(origins = "*")
public class SingerController {
    @Autowired
    private SingerService singerService;

    /**
     * 根据歌手名字查询歌手信息并返回
     * @param singerName
     * @return
     */
    @GetMapping("getSingerByName/{singerName}")
    public R getSingerByName(@PathVariable("singerName") String singerName) {
        // 非空判断
        if (singerName==null||"".equals(singerName)){
            return R.error(AppHttpCodeEnum.PARAMETER_LACK);
        }
        return singerService.getSingerByName(singerName);
    }

    /**
     * 根据歌手id 查询对应的歌手专辑信息
     * @param singerId 歌手id
     * @return
     */
    @GetMapping("getAlbumBySingerId/{singerId}")
    public R getAlbumBySingerId(@PathVariable("singerId") Integer singerId) {
        // 非空判断
        if (singerId==null||"".equals(singerId)){
            return R.error(AppHttpCodeEnum.PARAMETER_LACK);
        }
        return singerService.getAlbumBySingerId(singerId);
    }

    /**
     * 根据歌手id 查询对应的歌手的全部歌曲信息
     * @param singerId 歌手id
     * @return
     */
    @GetMapping("getSongBySingerId/{singerId}")
    public R getSongBySingerId(@PathVariable("singerId") Integer singerId){
        // 非空判断
        if (singerId==null||"".equals(singerId)){
            return R.error(AppHttpCodeEnum.PARAMETER_LACK);
        }
        return singerService.getSongBySingerId(singerId);
    }

    /**
     * 根据歌手id，查询歌手的所有专辑以及专辑下的所有歌曲
     * @param singerId
     * @return
     */
    @GetMapping("getAlbumSongBySingerId/{singerId}")
    public R getAlbumSongBySingerId(@PathVariable("singerId") Integer singerId){
        // 非空判断
        if (singerId==null||"".equals(singerId)){
            return R.error(AppHttpCodeEnum.PARAMETER_LACK);
        }
        return singerService.getAlbumSongBySingerId(singerId);
    }

    /**
     * 获取歌手管理分页信息
     * @param pageCurrent 当前页
     * @param pageSize 每页条数
     * @param name 关键字 非必传
     * @return
     */
    @GetMapping({"/page/{pageCurrent}/{pageSize}",
            "/page/{pageCurrent}/{pageSize}/{name}"})
    public R getPage(@PathVariable("pageCurrent") Integer pageCurrent,
                     @PathVariable("pageSize") Integer pageSize,
                     @PathVariable(name = "name", required = false) String name){
        return singerService.getPage(pageCurrent, pageSize, name);
    }

    /**
     * 更改歌手当前状态
     * @param id 歌手 id
     * @param status 状态码 0：正常 1：异常
     * @return
     */
    @GetMapping("/status/{id}/{status}")
    public void setStatus(@PathVariable("id") Integer id, @PathVariable("status") Integer status){
        singerService.setStatus(id, status);
    }

    /**
     * 添加歌手-添加歌手名和歌手状态
     * 歌手图片，请参考下面的各自的上传方法
     * @param singer
     * @return
     */
    @PostMapping("/add")
    public R addSinger(@RequestBody Singer singer) {
        System.out.println("song:"+singer);
        // 数据非空判断，主要是 歌曲名和状态
        if (singer.getSingerName()==null||"".equals(singer.getSingerName())){
            return R.error(AppHttpCodeEnum.PARAMETER_LACK);
        }
        return singerService.addSinger(singer);
    }

    /**
     * 添加歌手-上传歌手图片
     * @param file 图片
     * @return
     */
    @PostMapping("/uploadAddImg")
    public R uploadAddImg(MultipartFile file) {
        // 1、文件校验
        // 是否是图片文件 image/jpeg，是不是以 image 开头的
        if (!file.getContentType().startsWith("image")){
            return R.error(AppHttpCodeEnum.IMAGE_ERROR_TYPE);
        }
        // 判断文件大小不能超过 30MB
        if (file.getSize() > 30*1024*1024){
            return R.error(AppHttpCodeEnum.FILE_EXCEED);
        }
        return singerService.uploadAddImg(file);
    }

    /**
     * 根据歌手 id，删除歌手
     * 既要删除数据库里的关于此歌手的一切信息
     * 1、歌手数据，
     * 2、此歌手的歌曲信息（包括云存储桶的文件信息）
     * 3、此歌手的专辑信息（包括云存储桶的文件信息）
     * 4、歌手和歌曲、歌手和专辑、此歌手歌曲和专辑的关联关系
     * 又要删除 云存储桶里的 图片 数据
     * @param id 歌手id
     * @return
     */
    @DeleteMapping("/delete/{id}")
    public R deleteSingerById(@PathVariable("id") Integer id) {
        return singerService.deleteSingerById(id);
    }

    /**
     * 根据歌手id，查询单个歌手信息
     * @param id 歌手id
     * @return
     */
    @GetMapping("/selectOne/{id}")
    public R selectOneById(@PathVariable("id") Integer id){
        return singerService.selectOneById(id);
    }

    /**
     * 修改歌手基本信息
     * 只需要修改数据库里的 歌手基本信息
     * 对于 数据库里的信息可以使用 update
     * 对于 云存储桶里 歌手图片，先删除再添加，调用的上传的 api，本接口不需要处理
     * @param singer
     * @return
     */
    @PutMapping("/update")
    public R updateSinger(@RequestBody Singer singer){
        //非空判断
        if ("".equals(singer.getSingerName())||singer.getSingerName()==null){
            return R.error(AppHttpCodeEnum.PARAMETER_LACK);
        }
        return singerService.updateSinger(singer);
    }

    /**
     * 批量删除
     * @param ids 歌手 id数组
     * @return
     */
    @DeleteMapping("deleteBatch")
    public R deleteSingerBatch(@RequestBody List<Integer> ids){
        if(ids == null || ids.size() ==0 ){
            return R.error(AppHttpCodeEnum.PARAMETER_LACK);
        }
        return singerService.deleteSingerBatch(ids);
    }

}
